﻿using Furion;
using Furion.FriendlyException;
using FurStudy.Application;
using FurStudy.EntityFramework.Core;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FurStudy.Web.Core     
{
    [AppStartup(800)]
    public sealed class FurWebCoreStartup : AppStartup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            // Tips：services.AddSpecificationDocuments()通常和.AddDynamicApiControllers()成对出现。
            services.AddSpecificationDocuments();
            // 启用IErrorCodeTypeProvider提供器
            services.AddControllers().AddFriendlyException<IErrorCodeTypeProvider>() // 注册友好异常服务（注：.AddFriendlyException()需在services.AddControllers()之后注册）
                .AddDataValidation<MyValidationTypeMessageProvider>(); // 注册验证消息提供器

            services.AddConfigurableOptions<AppInfoOptions>();

            // 关于注册器注册顺序：通常先注册的会先执行，也可以通过实现IOrderedFilter接口配置Order属性，数值越小，越先执行
            services.AddMvcFilter<RequestAuditFilter>(); // 注册RequestAuditFilter筛选器

            // 注册自定义过滤器
            services.AddDbPool<FurionDbContext>(interceptors: new Microsoft.EntityFrameworkCore.Diagnostics.IInterceptor[] 
            {
                new SqlConnectionInterceptor(),
                new DbContextSaveChangesInterceptor(),
                new SqlCommandProfilerInterceptor()
            });

            // 注意：services.AddCorsAccessor();需在services.AddControllers()之前注册。
            // 添加CORS服务
            services.AddCorsAccessor(); // 配置跨域

            // 添加视图引擎
            services.AddViewEngine();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // .UseInject()已经包含了.UseSpecificationDocuments()注册，无需再次注册。
            app.UseSpecificationDocuments();

            // 路由的默认地址(/api)，可以通过两种方式配置
            // 1）app.UseInject("路由")方式
            app.UseInject("testapi"); // 那么 /testapi 就是规范化地址
            // 2）配置文件配置：见FurStudy.Web.Entry - appsettings.json

            app.UseEndpoints(endpoints => 
            {
                endpoints.MapControllers();
            });

            // 特别注意：app.UseCorsAccessor(); 需在app.UseRouting();和app.UseAuthentication();之间注册。
            app.UseCorsAccessor(); // 添加跨域中间件
        }
    }
}
